package com.aop.dongtai.daili;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理人 代理对象   做其他业务，重复的 
 * 
 * 动态代理：需要实现一个借口 invocationHandler
 * 
 * @author My
 *
 */
public class ProxyFactory  {
	
	//目标对象  
	private Object obj;
	
	//用构造方法注入
	public ProxyFactory(Object obj) {
		this.obj = obj;
	}
	
	//实现借口的方法
	/**
	 * 
	 * Object proxy  代理
	 * 
	 * Method method 要代理的方法
	 * 
	 *  Object[] args 方法的参数
	 * 
	 * 
	 */
	//可以在下面的写  实现借口的方法
/*	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		System.out.println("开启事务 打电话和老板确认价钱 时间");
		
//		dao.sing("xx");
		//业务方法    obj目标对象   args 目标对象的参数
		Object invoke = method.invoke(obj, args);
		
		
		System.out.println("提交事务 ");
		
		System.out.println("回滚事务");
		return invoke;
	}
	*/
	
	
	/**
	 * 
	 * loader  类加载器，在那个类上执行
	 * 
	 * interfaces  目标对象现实的接口
	 * 
	 * h
	 */
	public Object createProxyInstence(){
		
		ClassLoader loader=this.getClass().getClassLoader();
		Class<?>[] interfaces=obj.getClass().getInterfaces();
		
		//方法的定义，先不运行，调用的时候才调,,优先调用这里的方法
		InvocationHandler h=new InvocationHandler(){
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				
				//内部类
				System.out.println("开启事务 打电话和老板确认价钱 时间");
//				dao.sing("xx");
				//业务方法    obj目标对象   args 目标对象的参数
				Object invoke = method.invoke(obj, args);
				System.out.println("提交事务 ");
				
				System.out.println("回滚事务");
				return invoke;
			}
		};
		Object object=Proxy.newProxyInstance(loader, interfaces, h);
		
		//生成的代理对象
		return object;
				
	}
	
	
	
	

	

}
